3.5 数据管理

学习目标:
说出 数据卷、数据容器是什么
应用 数据卷、数据容器的常见操作
docker 镜像是 只读 的,虽然 依据镜像创建的 容器 可以进行操作 但是 我们 不能将数据保存到容器中,因为容器会随时关闭和开启,那么如何将数据保存下来呢?
答案就是:数据卷和数据卷容器

3.5.1 数据卷 简介

这一节,我们从定义、命令详解 这两个方面来学习。
 
什么是数据卷?
就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储
缺点是:太单一了
docker 数据卷命令详解
# docker run --help
。。。
  -v, --volume list               Bind mount a volume (default [])
  挂载一个数据卷,默认为空
我们可以使用命令 docker run 用来创建容器,可以在使用 docker run 命令时添加 -v 参数,就可以创建并挂载 一个到多个 数据卷到当前运行的容器中。
-v 参数的作用是将宿主机的一个目录 ( 绝对路径 ) 作为容器的数据卷挂载到 docker 容器中,使宿主机和容器之间可以共享一个目录,如果本地路径不存在, Docker 也会自动创建。
-v 宿主机文件 : 容器文件

3.5.2 数据卷实践

这一节,我们从目录实践、文件实践两个方面来学习。
关于数据卷的管理我们从两个方面来说:
1 、目录
2 、普通文件
数据卷实践 目录
命令格式:
docker run -itd --name [ 容器名字 ] -v [ 宿主机目录 ]:[ 容器目录 ] [ 镜像名称 ] [ 命令 ( 可选 )]
命令演示:
创建测试文件
echo "file1" > /tmp/file1.txt
启动一个容器,挂载数据卷
docker run -itd --name test1 -v /tmp:/test1 nginx
测试效果
~# docker exec -it a53c61c77 /bin/bash
root@a53c61c77bde:/# cat /test1/file1.txt
file1
数据卷实践 文件
命令格式:
docker run -itd --name [ 容器名字 ] -v [ 宿主机文件 ]:[ 容器文件 ] [ 镜像名称 ] [ 命令 ( 可选 )]
注意:容器里面的文件虽然可以改名,但类型必须和宿主机文件一致
命令演示:
创建测试文件
echo "file1" > /tmp/file1.txt
启动一个容器,挂载数据卷
docker run -itd --name test2 -v /tmp/file1.txt:/nihao/nihao.sh nginx
测试效果
~# docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh
file1
数据卷实践 删除
docker volume rm
docker volume prune

3.5.3 数据卷容器简介

这一节,我们从定义、命令详解、操作流程这三个方面来学习。
什么是数据卷容器?
将宿主机的某个目录,使用容器的方式来表示,然后其他的应用容器将数据保存在这个容器中,达到大批量应用数据同时存储的目的
docker 数据卷命令详解
# docker run --help
。。。
  -v, --volumes-from value       Mount volumes from the specified container(s) (default [])

从指定的容器挂载卷,默认为空
 
数据卷容器操作流程
如果使用数据卷容器,在多个容器间共享数据,并永久保存这些数据,需要有一个规范的流程才能做得到:
1 、创建数据卷容器
2 、其他容器挂载数据卷容器
注意:
数据卷容器不启动

3.5.4 数据卷容器实践

这一节,我们从创建、使用、效果查看三个方面来学习。
数据卷容器实践包括两部分:创建数据卷容器和使用数据卷容器
 
创建一个数据卷容器
命令格式:
docker create -v [ 容器数据卷目录 ] --name [ 容器名字 ] [ 镜像名称 ] [ 命令 ( 可选 )]
执行效果
docker create -v /data --name v-test nginx
创建两个容器,同时挂 载数据卷容器
命令格式:
docker run --volumes-from [ 数据卷容器 id/name] -tid --name [ 容器名字 ] [ 镜像名称 ] [ 命令 ( 可选 )]
执行效果:
创建 vc-test1 容器
docker run --volumes-from 4693558c49e8 -tid --name vc-test1 nginx /bin/bash
创建 vc-test2 容器
docker run --volumes-from 4693558c49e8 -tid --name vc-test2 nginx /bin/bash
确认卷容器共享
进入 vc-test1 ,操作数据卷容器
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt
root@c408f4f14786:/# exit
进入 vc-test2 ,确认数据卷
~# docker exec -it vc-test2 /bin/bash
root@7448eee82ab0:/# ls /data/
v-test1.txt
root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt
root@7448eee82ab0:/# exit
回到 vc-test1 进行验证
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
v-test1.txt  v-test2.txt
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2
回到宿主机查看 /data/ 目录
~# ls /data/
~#

结果证明:
容器间可以共享数据卷你容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中

3.6 网络管理

学习目标:
了解 Docker 网络模型及其特点
应用 端口映射常见操作
 
Docker 网络很重要,重要的,我们在上面学到的所有东西都依赖于网络才能工作。我们从两个方面来学习网络:端口映射和网络模式
为什么先学端口映射呢?
在一台主机上学习网络,学习端口映射最简单,避免过多干扰。

3.6.1 端口映射详解

这一节,我们从简介、种类两个方面来学习。
 
端口映射简介
默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。这样我们就可以通过 宿主机的 ip+port 的方式来访问容器里的内容
 
端口映射种类
1 、随机映射 -P( 大写 )
2 、指定映射      -p 宿主机端口 : 容器端口
 
注意:
生产场景一般不使用随机映射 ,但是随机映射的好处就是由 docker 分配,端口不会冲突 ,
不管哪种 映射都会影响性能,因为 涉及到 映射

3.6.2 随机映射实践

这一节,我们从随机映射、指定随机映射这两个方面来学习。
 
随机映射我们从两个方面来学习:
默认随机映射
指定主机随机映射
 
默认随机映射
命令格式:
docker run -d -P [ 镜像名称 ]
命令效果:
启动一个 nginx 镜像
docker run -d -P nginx
查看效果
注意:
     宿主机的 32768 被映射到容器的 80 端口
-P 自动绑定 所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中自动 随机选择 但是如果 连续 启动多个容器的话,则下一个容器的端口默认是当前容器占用 端口 +1
 

注意:
浏览器输入的格式是: docker 容器宿主机的 ip: 容器映射的端口
指定主机随机映射
命令格式
docker run -d -p [ 宿主机 ip]::[ 容器端口 ] --name [ 容器名称 ] [ 镜像名称 ]
命令效果
docker run -d -p 192.168.8.14::80 --name nginx-2 nginx
检查效果

3.6.3 指定映射实践

这一节,我们从指定端口、指定多端口两个方面来学习。
 
指定端口映射
命令格式:
docker run -d -p [ 宿主机 ip]:[ 宿主机端口 ]:[ 容器端口 ] --name [ 容器名字 ] [ 镜像名称 ]
注意:
如果 不指定宿主机 ip 的话,默认使用   0.0.0.0
容器端口必须清楚,而且必须写出来
 
命令实践:
现状我们在启动容器的时候,给容器指定一个访问的端口 1199
docker run -d -p 192.168.8.14:1199:80 --name nginx-1 nginx
查看新容器 ip
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 0ad3acfbfb76
查看容器端口映射
查看宿主机开启端口
查看浏览器效果:


多端口映射方法
命令格式
docker run -d -p [ 宿主机端口 1]:[ 容器端口 1]  -p [ 宿主机端口 2]:[ 容器端口 2] --name [ 容器名称 ] [ 镜像名称 ]
开起多端口映射实践
docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx
查看容器进程